﻿#define _CRT_SECURE_NO_WARNINGS 1


//重载函数

//C++⽀持在同⼀作⽤域中出现同名函数，但是要求这些同名函数的形参不同，可以是参数个数不同或者
//类型不同。这样C++函数调⽤就表现出了多态⾏为，使⽤更灵活。C语⾔是不⽀持同⼀作⽤域中出现同名函数的
//#include<iostream>
//using namespace std;
// 1、参数类型不同
/*int Add(int left, int right)
{
	cout << "int Add(int left, int right)" << endl;
	return left + right;
}
double Add(double left, double right)
{
	cout << "double Add(double left, double right)" << endl;
	return left + right;
}*/
// 2、参数个数不同
//void f()
//{
//	cout << "f()" << endl;
//}
//void f(int a)
//{
//	cout << "f(int a)" << endl;
//}
// 3、参数类型顺序不同
//void f(int a, char b)
//{
//	cout << "f(int a,char b)" << endl;
//}
//void f(char b, int a)
//{
//	cout << "f(char b, int a)" << endl;
//}


// 返回值不同不能作为重载条件，因为调⽤时也⽆法区分
//void fxx()
//{}
//
//int fxx()
//{
// return 0;
//}
// 下⾯两个函数构成重载
// f()但是调⽤时，会报错，存在歧义，编译器不知道调⽤谁
//void f1()
//{
//	cout << "f()" << endl;
//}
//void f1(int a = 10)
//{
//	cout << "f(int a)" << endl;
//}

/////////////////////////////////////////////////////////////////////////////////


//引用  int& a = b; //为b赋别名a 两个名字 指向同一个东西
//引⽤在定义时必须初始化
//⼀个变量可以有多个引⽤

//可以使用引用替代指针
//#include <iostream>
//using namespace std;
//void Swap(int& rx, int& ry)
//{
//	int tmp = rx;
//	rx = ry;
//	ry = tmp;
//}
//int main()
//{
//	int x = 0, y = 1;
//	cout << x << " " << y << endl;
//	Swap(x, y);
//	cout << x << " " << y << endl;
//	return 0;
//}


//使用引用类型要正确  
//如: int* p = phead;
//    int*& tmp = p;  引用符号前类型务必要与目标对象类型相同



//int& STTop(ST& rs)
//{
//	return rs.a[rs.top - 1];   //这里返回的是被引用对象的别名 而不是临时对象
//}                           //对于一般的传值调用 害怕返回函数内部的局部变量（函数栈帧销毁后结束） 于是设计了临时对象

//引用做函数返回值 函数调用表达式 返回值就是返回对象的别名

//不能返回函数内部定义的局部变量的引用 函数结束后空间被销毁 无意义
//返回引用，实际是返回那块空间的别名，只要那块空间还在，就可以通过引用访问


/////////////////////////////////////////////////////////////////////////////////
//const 引用
//可以引⽤⼀个const对象，但是必须⽤const引⽤。const引⽤也可以引⽤普通对象，因为对象的访问权限在引⽤过程中可以缩⼩，但是不能放⼤
//int main()
//{
//	const int a = 10;
//	//权限不能放大
//	//int& ra = a; //
//
//	//权限可以平移
//	const int& ra = a;
//
//	//权限可以缩小
//	int b = 20;
//	const int& rb = b;
//
//	//不涉及权限放大缩小
//	//赋值拷贝，不是同一块空间
//	int rra = a;
//	return 0;
//}
//

//const引用 还可以引用常量 const int&ra = 10;
//不能 int&rb = a*3;  此时引用的是临时对象  a*3的和结果保存在⼀个临时对象中  临时对象具有常量性
//类型转换中间会产生临时对象
//使用const引用传参 可以传很多类型的变量
//引用传参可以减少拷贝 建议用引用传参 好处是实参可以是常量、运算表达式等 

////////////////////////////////////////////////////////////////////////////////////////
//指针和引用的关系
//• 语法概念上引⽤是⼀个变量的取别名不开空间，指针是存储⼀个变量地址，要开空间。
//• 引⽤在定义时必须初始化，指针建议初始化，但是语法上不是必须的。
//• 引⽤在初始化时引⽤⼀个对象后，就不能再引⽤其他对象；⽽指针可以在不断地改变指向对象。
//• 引⽤可以直接访问指向对象，指针需要解引⽤才是访问指向对象。
//• sizeof中含义不同，引⽤结果为引⽤类型的⼤⼩，但指针始终是地址空间所占字节个数(32位平台下占4个字节，64位下是8byte)
//• 指针很容易出现空指针和野指针的问题，引⽤很少出现，引⽤使⽤起来相对更安全⼀些




/////////////////////////////////////////////////////////////////////////////////////////
//nullptr 会隐式地自动转换为指针类型 不会转换为整型 C++中空指针推荐用nullptr